/* Hey Emacs use -*- mode: C -*- */
/*
 * tracedump.api - streaming packet trace dump API
 *
 * Copyright (c) 2020 Cisco and/or its affiliates
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file tracedump.api
 * @brief VPP control-plane API messages.
 *
 * This file defines VPP control-plane binary API messages which are generally
 * called through a shared memory interface.
 */


option version = "0.1.0";

enum trace_filter_flag : u32
{
  TRACE_FF_NONE = 0,
  TRACE_FF_INCLUDE_NODE = 1,
  TRACE_FF_EXCLUDE_NODE = 2,
  TRACE_FF_INCLUDE_CLASSIFIER = 3,
  TRACE_FF_EXCLUDE_CLASSIFIER = 4,
};


/** \brief trace_set_filters
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param flag - One of the trace_filter_flag values
    @param node_index = The node-index to include/exclude 
    @param classifier_table_index = The include/exclude classifier table
    @param count = The number of packets to include/exclude
*/
autoreply define trace_set_filters
{
  u32 client_index;
  u32 context;
  vl_api_trace_filter_flag_t flag;	/* TRACE_FF_* */
  u32 count;
  u32 node_index [default = 0xffffffff];
  u32 classifier_table_index [default = 0xffffffff];
  option vat_help =   "trace_set_filters [none] | [(include_node|exclude_node) <node-index>] | [(include_classifier|exclude_classifier) <classifier-index>] [count <count>]";
};


/** \brief trace_capture_packets
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param node_index - graph input node whose packets are captured
    @param max_packets - maximum number of packets to capture
    @param use_filter - if true, apply filters to select/reject packets
    @param verbose - if true, set verbose packet capture flag
    @param pre_capture_clear - if true, clear buffer before capture begins
*/
autoreply define trace_capture_packets
{
  u32 client_index;
  u32 context;
  u32 node_index;
  u32 max_packets;
  bool use_filter;
  bool verbose;
  bool pre_capture_clear;
  option vat_help = "trace_capture_packets [node_index <index>] [max <max>] [pre_capture_clear] [use_filter] [verbose]";
};


/** \brief trace_clear_capture
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
*/
autoreply define trace_clear_capture
{
  u32 client_index;
  u32 context;
  option vat_help = "trace_clear_capture";
};


service {
    rpc trace_dump returns trace_dump_reply
        stream trace_details;
};

define trace_dump {
    /* Client identifier, set from api_main.my_client_index */
    u32 client_index;

    /* Arbitrary context, so client can match reply to request */
    u32 context;

    /* Dispose of any cached data before we begin */
    u8 clear_cache;

    /* iterator positions, both ~0 to just clear the cache */
    u32 thread_id;
    u32 position;

    /* Max number of replies per burst */
    u32 max_records;

    option vat_help = "trace_dump [thread_id <tid>] [position <pos>] [max <max>]";
};

define trace_dump_reply {
    u32 context;
    i32 retval;
    u32 last_thread_id;
    u32 last_position;
    u8 more_this_thread;
    u8 more_threads;
    u8 flush_only;
    u8 done;
};

define trace_details {
    /* Client identifier, set from api_main.my_client_index */
    u32 client_index;

    /* Arbitrary context, so client can match reply to request */
    u32 context;

    /* Position in the cache of this record */
    u32 thread_id;
    u32 position;

    /* More or not */
    u8 more_this_thread;
    u8 more_threads;
    /* Needed when set ends in the middle of a batch */
    u8 done;

    u32 packet_number;
    string trace_data[];
};
